package com.shujia.this_;


public class Person {

    private String name;

    private int age;

    // 如果我们提供了带参的构造方法, 无参的构造方法默认就不提供了
    // 一般我们在提供了带参的构造方法之后也会手动提供无参的构造方法
    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 封装的形参一般会和属性相同
    public void setName(String name) {
        // name = name; // 自己给自己赋值
        // 成员变量和局部变量重名
        this.name = name;
    }

    public String getName() {
        return name;
    }

    // getXxx, setXxx方法可以自动生成
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sleep(Person person) {
        System.out.println(person);
        System.out.println(name + "睡觉了");
    }

    public void sleep() {
        System.out.println(this);

        // 调用吃饭的方法, 如果创建新的对象, 就不是一个人
//        Person zs = new Person();
//        zs.eat();
        // 需要使用同一个对象
        // this.eat();
        eat();// this可以省略


        /*
        我们直接访问局部变量和属性不同名变量, 相当于访问的是this.属性
        如果同名的话, 默认访问的就是局部变量, 想要访问属性this关键不能省略
         */
        System.out.println(this.name + "睡觉了");
    }


    public void eat() {
        // 在没有使用static修饰方法里, 可以使用this关键字
        // this代表的就是当前对象, 对象在Java里面就是内存地址值, 地址值是new出来的
        // 哪个对象调用的方法, this就代表哪个对象
        /*
          a. 成员变量和局部变量重名
          b. 创建任意一个对象默认都会创建一个this的引用指向同一个堆区空间,
          d. 默认一个类的成员都会省略掉this关键字
          e. 谁调用就是谁。this表示当前对象的引用
          f. this只能够出现在类的方法里。
         */
        System.out.println(this);

        System.out.println(name + "吃晚饭");
    }

}
